home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / uasm.zip / 6805SYM.C < prev    next >
C/C++ Source or Header  |  1986-04-06  |  18KB  |  495 lines

  1. /*
  2.         Custom Computer Consultants
  3.         Universal Cross Assembler
  4.         6805 Symbols
  5.         5 April 1985
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <uasm.h>
  10.  
  11. char   *version = {"6805 Assembler -- V3.2  4/5/86\n"} ;
  12.  
  13. #define CSEG    1       /*      Code Segment            */
  14. #define DSEG    2       /*      Data Segment            */
  15. #define ASCII   4       /*      String                  */
  16. #define PAGE    5       /*      Page Eject              */
  17. #define RADIX   6       /*      Define Radix            */
  18. #define DB      8       /*      Define Byte             */
  19. #define DS      9       /*      Define Storage          */
  20. #define DW      10      /*      Define Word             */
  21. #define EQU     11      /*      Equate                  */
  22. #define ORG     12      /*      Origin                  */
  23.  
  24. extern int     pass1 ;
  25. extern int     lbl ;
  26. extern int     i, j, k ;
  27. extern int     lnspp ;
  28. extern int     cc ;
  29. extern int     ilc ;
  30. extern int     active ;
  31. extern int     instl ;
  32. extern int     parval ;
  33. extern int     radix ;
  34. extern int     cput ;
  35. extern int     syte, sytx ;
  36.  
  37. extern unsigned        unpar ;
  38. extern unsigned        ha, he, hsp ;
  39.  
  40. extern unsigned  char    ch ;
  41. extern unsigned  char    sym ;
  42.  
  43. extern char    *iptr ;  
  44. extern char    segtype[] ;
  45.  
  46. extern unsigned  char    ib[] ;
  47. extern unsigned  char    pv[] ;
  48. extern unsigned  char    px[] ;
  49.  
  50. extern           int     pj[] ;
  51. extern           int     il[] ;
  52. extern char    *pc[], *pseudo[] ;
  53.  
  54. extern int     (*pp[])() ;
  55. extern int     (*ppo[])() ;
  56.  
  57. extern char    ibuf[] ;
  58.  
  59. extern struct  symbol  symtab[] ;
  60.  
  61. #define SYMTYPE  (symtab[sytx].flags&(NSEG-1))
  62.  
  63. code_seg() { return CSEG ; }
  64.  
  65. not_cseg(seg)
  66. int    seg ;
  67. {
  68.        if( seg == DSEG ) return TRUE ;
  69.        else return FALSE ;
  70. }
  71.  
  72. set_il()
  73. {
  74.        il[CSEG] =    0x80 ;
  75.        il[DSEG] =    0 ;
  76. }
  77.  
  78. set_type()
  79. {
  80.        segtype[CSEG] = '\'' ;
  81.        segtype[DSEG] = '\"' ;
  82. }
  83.  
  84.  
  85. gen(len)
  86. int     len ;
  87. {
  88.         ib[2] = parval & 0xFF ;
  89.         ib[1] = len == 3 ? parval >> 8 : ib[2] ;
  90.         instl = len ;
  91.         ib[0] = pv[k] ;
  92.         return TRUE ;
  93. }               
  94.  
  95. nopr()  { return gen(1) ; }
  96.  
  97. immd()  { if( nomatch("#") )            return FALSE ;
  98.           parval = eval() ;
  99.           return gen(2) ; }
  100.  
  101. dira()  { parval = eval() ;
  102.           if( ch == ',' )               return FALSE ;
  103.           return gen(2) ;  }
  104.  
  105. dorc()  { parval = eval() ;
  106.           if( ch == ',' )               return FALSE ;
  107.           gen(3) ;
  108.           if( ib[1] )                   return TRUE  ;
  109.           ib[0] -= 0x10 ;
  110.           ib[1] = ib[2] ;
  111.           --instl ;                     return TRUE  ; }
  112.  
  113. inx0()  { if( nomatch(",X") )           return FALSE ;
  114.           return gen(1) ;  }
  115.  
  116. inx1()  { parval = eval() ;
  117.           if( nomatch(",X") )           return FALSE ;
  118.           return gen(2) ;  }
  119.  
  120. indx()  { parval = eval() ;
  121.           if( nomatch(",X") )           return FALSE ;
  122.           gen(3) ;
  123.           if( ib[1] )                   return TRUE  ;
  124.           ib[0] += 0x10 ;
  125.           ib[1] = ib[2] ;
  126.           --instl ;                     return TRUE  ; }
  127.  
  128. rela()  { crela(2) ;
  129.           return gen(2) ; }
  130.  
  131. crela(n)
  132. int     n ;
  133. {
  134.         parval = eval() - ( ilc + n ) ;
  135.         if( parval > 127 || parval < -128 ) push('R') ;
  136. }
  137.  
  138. bada()  { unpar = 2 * eval() ;
  139.           if( notcomma() )              return FALSE ;
  140.           parval = eval() ;
  141.           gen(2) ;
  142.           ib[0] |= ( unpar & 0x0E ) ;   return TRUE  ; }
  143.  
  144. bdrl()  { unpar = 2 * eval() ;
  145.           if( notcomma() )              return FALSE ;
  146.           parval = eval() ;
  147.           if( notcomma() )              return FALSE ;
  148.           gen(2) ;
  149.           ib[0] |= ( unpar & 0x0E ) ;
  150.           crela(3) ;
  151.           ib[2] = parval & 0xFF ;
  152.           instl = 3 ;                   return TRUE  ; }
  153.  
  154. areg()  { if( nomatch("A") )            return FALSE ;
  155.           return gen(1) ; }
  156.  
  157. xreg()  { if( nomatch("X") )            return FALSE ;
  158.           return gen(1) ; }
  159.  
  160.  
  161. #define INFO     1
  162. #define NOINFO   0
  163.  
  164. doseg()
  165. {
  166.        il[active] = ilc ;
  167.        ilc = il[j] ;
  168.        active = j ;
  169.        return NOINFO ;
  170. }
  171.  
  172. dods()
  173. {
  174.        instl = eval() ;
  175.        return NOINFO ;
  176. }
  177.  
  178. dodw()
  179. {                
  180.        parval = eval() ;
  181.        ib[cput++] = parval >> 8 ;
  182.        ib[cput++] = parval & 0xFF ;
  183.        while ( sym == ',' ) {
  184.          getch() ;
  185.          parval = eval() ;
  186.          ib[cput++] = parval >> 8 ;
  187.          ib[cput++] = parval & 0xFF ;
  188.          }
  189.        instl = cput ;
  190.        return INFO ;
  191. }
  192.  
  193. dodb()
  194. {
  195.        parval = eval() ;
  196.        ib[cput++] = parval & 0xFF ;
  197.        while ( sym == ',' ) {
  198.          getch() ;
  199.          ib[cput++] = eval() & 0xFF ;
  200.          }
  201.        instl = cput ;
  202.        return INFO ;
  203. }                            
  204.  
  205.  
  206. doequ()
  207. {
  208.        parval = eval() ;
  209.        if ( pass1 && (lbl == OK) ) {
  210.          symtab[syte-1].value = parval ;
  211.          symtab[syte-1].flags = active ;
  212.          }
  213.        return NOINFO ;
  214. }
  215.  
  216. doorg()
  217. {
  218.        parval = eval() ;
  219.        ilc = parval ;
  220.        if ( hsp == 0 ) ha = he = ilc ;
  221.        return NOINFO ;
  222. }
  223.  
  224. dopage()
  225. {
  226.        lnspp = 0 ;
  227.        return NOINFO ;
  228. }
  229.  
  230. doradix()
  231. {
  232.        radix = parval ;
  233.        return NOINFO ;
  234. }
  235.  
  236. doascii()
  237. {
  238.        while( isin(ch," \t") ) getch() ;
  239.        sym = ch ; getch() ;
  240.        while( ch != sym && ch != '\n' ) {
  241.          ib[cput++] = ch ;
  242.          getch() ;
  243.          }
  244.        ib[cput++] = EOS ;
  245.        instl = cput ;
  246.        return INFO ;
  247. }
  248.  
  249. /*
  250.         build_pseudo -- build a table of pointers to pseudo-ops
  251. */
  252.  
  253. build_pseudo()
  254. {
  255.         
  256.         j = -1 ;
  257.         pseudo[++j] = "ASCII" ; pj[j] = ASCII ; ppo[ASCII] = doascii ;
  258.         pseudo[++j] = "CSEG"  ; pj[j] = CSEG  ; ppo[CSEG]  = doseg   ;
  259.         pseudo[++j] = "DB"    ; pj[j] = DB    ; ppo[DB]    = dodb    ;
  260.         pseudo[++j] = "DS"    ; pj[j] = DS    ; ppo[DS]    = dods    ;
  261.         pseudo[++j] = "DSEG"  ; pj[j] = DSEG  ; ppo[DSEG]  = doseg   ;
  262.         pseudo[++j] = "DW"    ; pj[j] = DW    ; ppo[DW]    = dodw    ;
  263.         pseudo[++j] = "EQU"   ; pj[j] = EQU   ; ppo[EQU]   = doequ   ;
  264.         pseudo[++j] = "ORG"   ; pj[j] = ORG   ; ppo[ORG]   = doorg   ;
  265.         pseudo[++j] = "PAGE"  ; pj[j] = PAGE  ; ppo[PAGE]  = dopage  ;
  266.         pseudo[++j] = "RADIX" ; pj[j] = RADIX ; ppo[RADIX] = doradix ;
  267.         return ++j ;
  268. }
  269.  
  270.  
  271. /*
  272.         buildopc -- build opcode definition tables
  273.                 pc - opcode strings
  274.                 px - index by opcode into opcode values & post processing
  275.                 pv - opcode values
  276.                 pp - post processing functions
  277. */
  278. buildopc()
  279. {
  280.  
  281.  
  282.         i = j = 0 ;
  283.  
  284.         pc[i]="ADC"   ; px[i++]=j ;     pv[j]=0xA9 ; pp[j++]=immd ;
  285.                                         pv[j]=0xF9 ; pp[j++]=inx0 ;
  286.                                         pv[j]=0xC9 ; pp[j++]=dorc ;
  287.                                         pv[j]=0xD9 ; pp[j++]=indx ;
  288.  
  289.         pc[i]="ADD"   ; px[i++]=j ;     pv[j]=0xAB ; pp[j++]=immd ;
  290.                                         pv[j]=0xFB ; pp[j++]=inx0 ;
  291.                                         pv[j]=0xCB ; pp[j++]=dorc ;
  292.                                         pv[j]=0xDB ; pp[j++]=indx ;
  293.  
  294.         pc[i]="AND"   ; px[i++]=j ;     pv[j]=0xA4 ; pp[j++]=immd ;
  295.                                         pv[j]=0xF4 ; pp[j++]=inx0 ;
  296.                                         pv[j]=0xC4 ; pp[j++]=dorc ;
  297.                                         pv[j]=0xD4 ; pp[j++]=indx ;
  298.  
  299.         pc[i]="ASL"   ; px[i++]=j ;     pv[j]=0x48 ; pp[j++]=areg ;
  300.                                         pv[j]=0x58 ; pp[j++]=xreg ;
  301.                                         pv[j]=0x78 ; pp[j++]=inx0 ;
  302.                                         pv[j]=0x38 ; pp[j++]=dira ;
  303.                                         pv[j]=0x68 ; pp[j++]=inx1 ;
  304.  
  305.         pc[i]="ASR"   ; px[i++]=j ;     pv[j]=0x47 ; pp[j++]=areg ;
  306.                                         pv[j]=0x57 ; pp[j++]=xreg ;
  307.                                         pv[j]=0x77 ;